package com.interview.javabase.algorithm;

/**
 * @author: zsg
 * @description:
 * @date: 2019/8/22 20:35
 * @modified:
 */
public class HeadWriteStack {

    public static void main(String[] args) {
//        ArrayStack arrayStack = new ArrayStack(10);
//        arrayStack.push(1);
//        arrayStack.push(2);
//        arrayStack.push(3);
//        arrayStack.push(4);
//        arrayStack.push(5);
//        arrayStack.push(6);
//        arrayStack.push(7);
//        arrayStack.push(8);
//        arrayStack.push(9);
//        arrayStack.push(10);
//        arrayStack.push(11);
//
//        arrayStack.printf();
//
//        arrayStack.pop();
//
//        arrayStack.printf();
//
//        arrayStack.pop();
//
//        arrayStack.printf();
        LinkedStack linkedStack = new LinkedStack();
        linkedStack.push(1);
        linkedStack.push(2);
        linkedStack.push(3);
        linkedStack.push(4);
        linkedStack.push(5);
        linkedStack.push(6);
        linkedStack.push(7);

        linkedStack.printf();

        linkedStack.pop();

        linkedStack.printf();

        linkedStack.pop();

        linkedStack.printf();

    }

}

class LinkedStack{

    private LinkedNode rear;


    public int pop(){
        LinkedNode temp = rear;

        rear = temp.next;

        return temp.val;
    }

    public void push(int value){
        if (rear == null){
            rear  = new LinkedNode(value);
            return;
        }
        LinkedNode temp = rear;
        LinkedNode linkedNode = new LinkedNode(value);
        linkedNode.next = temp;
        rear = linkedNode;
    }

    public void printf(){
        LinkedNode temp = rear;
        while (temp != null){
            System.out.print(temp.val);
            temp = temp.next;
        }

        System.out.println();
    }
}
class ArrayStack{
    private int maxStack;

    private int top =-1;

    private Integer[] stacks;

    public ArrayStack(int maxStack){
        this.maxStack = maxStack;
        this.stacks = new Integer[maxStack];
    }

    public boolean isFull(){
        return top == maxStack -1;
    }

    public boolean isEmpty(){
        return top == -1;
    }

    public Integer pop(){
        if (isEmpty()){
            throw new IllegalStateException("栈为空");
        }

        return stacks[top--];
    }

    public void push(int value){
        if (isFull()){
            System.out.println("栈满了");
        }

        stacks[++top] = value;
    }

    public void printf(){
        if (isEmpty()){
            throw new IllegalStateException("栈为空");
        }

        for (int i = top; i >=0 ; i--) {
            System.out.println(stacks[i]);
        }
    }
}
